{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "b3ad1c9c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "from torchvision import transforms\n",
    "from torchvision import datasets\n",
    "import matplotlib.pyplot as plt\n",
    "from PIL import Image\n",
    "import numpy as np\n",
    "import cv2 \n",
    "import os\n",
    "os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "6ce9dd81",
   "metadata": {},
   "outputs": [],
   "source": [
    "class CNN(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(CNN, self).__init__()\n",
    "        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)\n",
    "        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)\n",
    "        self.fc1 = nn.Linear(320, 50)\n",
    "        self.fc2 = nn.Linear(50, 10)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = nn.functional.relu(nn.functional.max_pool2d(self.conv1(x), 2))\n",
    "        x = nn.functional.relu(nn.functional.max_pool2d(self.conv2(x), 2))\n",
    "        x = x.view(-1, 320)\n",
    "        x = nn.functional.relu(self.fc1(x))\n",
    "        x = self.fc2(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "08412611",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "CNN(\n",
       "  (conv1): Conv2d(1, 10, kernel_size=(5, 5), stride=(1, 1))\n",
       "  (conv2): Conv2d(10, 20, kernel_size=(5, 5), stride=(1, 1))\n",
       "  (fc1): Linear(in_features=320, out_features=50, bias=True)\n",
       "  (fc2): Linear(in_features=50, out_features=10, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 加载保存的模型\n",
    "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
    "model = CNN().to(device)\n",
    "model.load_state_dict(torch.load('model.pth', map_location=device))\n",
    "model.eval()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "5f746420",
   "metadata": {},
   "outputs": [],
   "source": [
    "def preprocess_image(image_path):\n",
    "    \"\"\"\n",
    "    加载图片并转换为灰度图，同时进行二值化处理。\n",
    "    \"\"\"\n",
    "    # 使用 OpenCV 加载图片\n",
    "    image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)\n",
    "\n",
    "    # 二值化处理（将像素值变为黑白）\n",
    "    _, binary = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY_INV)\n",
    "\n",
    "    return binary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "cf2068a1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数字分割函数\n",
    "def segment_digits(binary_image):\n",
    "    \"\"\"\n",
    "    使用轮廓检测算法分割数字。\n",
    "    \"\"\"\n",
    "    # 查找轮廓\n",
    "    contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)\n",
    "\n",
    "    # 存储每个数字的边界框\n",
    "    digit_bounding_boxes = []\n",
    "\n",
    "    for contour in contours:\n",
    "        # 获取轮廓的边界框\n",
    "        x, y, w, h = cv2.boundingRect(contour)\n",
    "\n",
    "        # 过滤掉过小的噪声\n",
    "        if h > 10 and w > 5:\n",
    "            digit_bounding_boxes.append((x, y, w, h))\n",
    "\n",
    "    # 按从左到右排序数字\n",
    "    digit_bounding_boxes = sorted(digit_bounding_boxes, key=lambda x: x[0])\n",
    "\n",
    "    return digit_bounding_boxes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "2a872843",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数字裁剪与模型预测函数\n",
    "def predict_digits(binary_image, bounding_boxes):\n",
    "    \"\"\"\n",
    "    根据分割的数字边界框裁剪数字并使用模型进行预测。\n",
    "    \"\"\"\n",
    "    predictions = []\n",
    "    for box in bounding_boxes:\n",
    "        x, y, w, h = box\n",
    "        # 裁剪数字区域\n",
    "        digit_image = binary_image[y:y+h, x:x+w]\n",
    "        # 调整到 MNIST 的大小 (28x28)\n",
    "        digit_image = cv2.resize(digit_image, (28, 28), interpolation=cv2.INTER_AREA)\n",
    "        # 转换为 PyTorch 张量\n",
    "        digit_tensor = torch.tensor(digit_image, dtype=torch.float32).unsqueeze(0).unsqueeze(0).to(device)\n",
    "\n",
    "        # 使用模型预测\n",
    "        with torch.no_grad():\n",
    "            output = model(digit_tensor)\n",
    "            _, predicted = torch.max(output, 1)\n",
    "            predictions.append(predicted.item())\n",
    "\n",
    "    return predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "1dc3e230",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Predicted Digits: 2022210839\n"
     ]
    }
   ],
   "source": [
    "# 主程序\n",
    "if __name__ == '__main__':\n",
    "    # 加载并预处理图片\n",
    "    image_path = 'example.png'\n",
    "    binary_image = preprocess_image(image_path)\n",
    "\n",
    "    # 分割数字\n",
    "    bounding_boxes = segment_digits(binary_image)\n",
    "\n",
    "    # 可视化分割结果\n",
    "    image_with_boxes = cv2.cvtColor(binary_image, cv2.COLOR_GRAY2BGR)\n",
    "    for box in bounding_boxes:\n",
    "        x, y, w, h = box\n",
    "        cv2.rectangle(image_with_boxes, (x, y), (x+w, y+h), (0, 255, 0), 2)\n",
    "    plt.imshow(image_with_boxes)\n",
    "    plt.title(\"Segmented Digits\")\n",
    "    plt.show()\n",
    "\n",
    "    # 预测数字\n",
    "    predictions = predict_digits(binary_image, bounding_boxes)\n",
    "\n",
    "    # 输出结果\n",
    "    print(f\"Predicted Digits: {''.join(map(str, predictions))}\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "DL",
   "language": "python",
   "name": "dl"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.18"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
